<?php

namespace Kangcg\Application\Validate\Rules;


use Kangcg\Application\Validate\Validator;
use Kangcg\Helper\Validate\Rules\身份证号码;

class Identity implements RuleInterface
{
    use RuleTrait;

    public $message = ':attributes 请输入正确的身份证号码！';
    protected function afterRun(&$value, string $field, array $input, Validator $validator)
    {
        if(false === $this->isCreditNo($value)){
            return $validator->setError($this->getMessage($field));
        }
    }

    /**
     * 验证身份证号码是否正确!
     * @param $vStr 身份证号码
     * @return bool
     */
    private function isCreditNo($vStr) :bool
    {
        $vCity = [
            '11', '12', '13', '14', '15', '21', '22',
            '23', '31', '32', '33', '34', '35', '36',
            '37', '41', '42', '43', '44', '45', '46',
            '50', '51', '52', '53', '54', '61', '62',
            '63', '64', '65', '71', '81', '82', '91'
        ];

        if (!preg_match('/^([\d]{17}[xX\d]|[\d]{15})$/', $vStr)) {
            return false;
        }

        if (!in_array(substr($vStr, 0, 2), $vCity)) {
            return false;
        }

        $vStr = preg_replace('/[xX]$/i', 'a', $vStr);
        $vLength = strlen($vStr);
        if ($vLength == 18) {
            $vBirthday = substr($vStr, 6, 4) . '-' . substr($vStr, 10, 2) . '-' . substr($vStr, 12, 2);
        } else {
            $vBirthday = '19' . substr($vStr, 6, 2) . '-' . substr($vStr, 8, 2) . '-' . substr($vStr, 10, 2);
        }

        if (date('Y-m-d', strtotime($vBirthday)) != $vBirthday) {
            return false;
        }

        if ($vLength == 18) {
            $vSum = 0;
            for ($i = 17; $i >= 0; $i--) {
                $vSubStr = substr($vStr, 17 - $i, 1);
                $vSum += (pow(2, $i) % 11) * (($vSubStr == 'a') ? 10 : intval($vSubStr, 11));
            }

            if ($vSum % 11 != 1) return false;
        }

        return true;
    }
}
